package br.edu.universo.si.projeto2.infojob.server.negocio;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanMensagem;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalCurriculo;
import br.edu.universo.si.projeto2.infojob.server.Database;
import br.edu.universo.si.projeto2.infojob.server.excecoes.CPFExistenteException;
import br.edu.universo.si.projeto2.infojob.server.excecoes.ContaExistenteException;
import br.edu.universo.si.projeto2.infojob.server.excecoes.EMailExistenteException;
import br.edu.universo.si.projeto2.infojob.server.excecoes.RGExistenteException;
import br.edu.universo.si.projeto2.infojob.server.persistencia.PCurriculo;
import br.edu.universo.si.projeto2.infojob.server.persistencia.PLogin;
import br.edu.universo.si.projeto2.infojob.server.persistencia.PProfissional;

public class NProfissional
{
	public static void cadastrarProfissional(BeanProfissionalAssinante bProfissionalAssinante) throws Exception
	{
		try
		{
			if (PLogin.isEmpresa(bProfissionalAssinante.getConta()) || PLogin.isProfissional(bProfissionalAssinante.getConta()))
			{
				throw new ContaExistenteException();
			}

			if (PProfissional.isCPFProfissionalCadastrado(bProfissionalAssinante.getCpf()))
			{
				throw new CPFExistenteException();
			}

			if (PProfissional.isEMailProfissionalCadastrado(bProfissionalAssinante.getEmail()))
			{
				throw new EMailExistenteException();
			}

			PProfissional.cadastrarProfissionalAssinante(bProfissionalAssinante);
		}
		catch (SQLException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
		catch (ClassNotFoundException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
		catch (CPFExistenteException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.getMessage());
		}
		catch (RGExistenteException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.getMessage());
		}
		catch (EMailExistenteException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.getMessage());
		}
	}
	
	
	public static BeanProfissionalAssinante getProfissionalById(Integer idProfissional) throws Exception
	{
		try
		{
			return PProfissional.getProfissionalById(idProfissional);
		}
		catch (SQLException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
		catch (ClassNotFoundException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
	}
	
	public static void alterarProfissional(BeanProfissionalAssinante bProfissionalAssinante)
		throws Exception
	{
		try
		{
	    	if (PProfissional.isEMailProfissionalCadastrado(bProfissionalAssinante.getEmail()))
	    	{
	    		throw new EMailExistenteException();
	    	}

	    	PProfissional.alteraDadosProfissional(bProfissionalAssinante);
		}
		catch (SQLException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
		catch (ClassNotFoundException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
		catch (EMailExistenteException ex)
		{
			ex.printStackTrace();
			throw new Exception(ex.toString());
		}
		catch (Exception ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
	}

	public static void encerrarContaProfissional(BeanProfissionalAssinante bProfissionalAssinante) throws Exception
	{
		Database database = Database.getInstance();

		Connection conn = database.getConnection();
		conn.setAutoCommit(false);

		try
		{
			// busca todos os curriculos do profissional
			ArrayList<BeanProfissionalCurriculo> clCurriculos = NCurriculo.getCurriculosDoProfissional(conn, bProfissionalAssinante);

			// excluir os curriculos enviados para vagas
			// exclui tbm cada curriculo encontrado, seus respectivos cursos e conhecimentos
			for (BeanProfissionalCurriculo curriculo : clCurriculos)
			{
				NVagas.excluirEnvioDeCurriculo(conn, curriculo);
				NCurriculo.excluirCurriculo(conn, curriculo);
			}

			// encontra todas as mensagens do profissional
			ArrayList<BeanMensagem> clMensagensCXEntrada = NMensagens.getMensagensCaixaEntrada(bProfissionalAssinante.getId());
			ArrayList<BeanMensagem> clMensagensCXSaida = NMensagens.getMensagensCaixaSaida(bProfissionalAssinante.getId());

			// apaga todas as mensagens do profissional
			NMensagens.excluirMensagensCxEntrada(conn, clMensagensCXEntrada);
			NMensagens.excluirMensagensCxSaida(conn, clMensagensCXSaida);

			// exclui o profissional propriamente dito
			PProfissional.excluirProfissional(conn, bProfissionalAssinante);
		}
		catch (ClassNotFoundException ex)
		{
			conn.rollback();
			ex.printStackTrace();
			throw new Exception(ex.toString());
		}
		catch (SQLException ex)
		{
			conn.rollback();
			ex.printStackTrace();
			throw new Exception(ex.toString());
		}
		catch (Exception ex)
		{
			conn.rollback();
			ex.printStackTrace();
			throw new Exception(ex.toString());
		}

		conn.commit();
	}

	public static ArrayList<BeanProfissionalCurriculo> getCurriculos(BeanProfissionalAssinante bProfissionalAssinante)
		throws Exception
	{
		try
		{
			return PCurriculo.getCurriculos(bProfissionalAssinante.getId());
		}
		catch (ClassNotFoundException ex)
		{
			ex.printStackTrace();
			throw new Exception(ex.toString());
		}
		catch (SQLException ex)
		{
			ex.printStackTrace();
			throw new Exception(ex.toString());			
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
			throw new Exception(ex.toString());
		}
	}

	public static ArrayList<BeanProfissionalAssinante> buscarProfissionais(String nome, Integer idadeLimite, Integer estado, String curso, ArrayList<String> conhecimentos)
		throws Exception 
	{
		try
		{
			  return PProfissional.buscarProfissionais(nome, idadeLimite, estado, curso, conhecimentos);
		}
		catch (ClassNotFoundException ex)
		{
			ex.printStackTrace();
			throw new Exception(ex.toString());
		}
		catch (SQLException ex)
		{
			ex.printStackTrace();
			throw new Exception(ex.toString());
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
			throw new Exception(ex.toString());
		}
	}
}